Java Technologies Immutable এবং Synchronized Collections তৈরি করা গাইড ও নোট

349

Java Collections Framework বিভিন্ন ধরনের কন্টেইনার বা ডেটা স্ট্রাকচার সরবরাহ করে, যেমন List, Set, Map ইত্যাদি। কখনও কখনও, আমরা এমন একটি Collection তৈরি করতে চাই যা অপরিবর্তনীয় (immutable) বা থ্রেড-সেফ (synchronized) হয়। এই ধরনের কন্টেইনার ব্যবহার করার সময় আমাদের কিছু নির্দিষ্ট নিয়ম অনুসরণ করতে হয়।

এই লেখায় আমরা দেখব কিভাবে Immutable Collections এবং Synchronized Collections তৈরি করা যায়।


1. Immutable Collections

Immutable Collections এমন একটি ডেটা স্ট্রাকচার যেখানে একবার উপাদান যোগ করা হলে সেটি পরিবর্তনযোগ্য থাকে না। এটি খুবই উপকারী যখন আপনি চান যে কোনো ডেটা কন্টেইনার একবার তৈরি হওয়ার পর তা মডিফাই না করা হয়, অর্থাৎ কোন add, remove, বা update অপারেশন হতে পারে না।

Java-তে Immutable Collections তৈরি করার জন্য আমরা Collections.unmodifiable মেথড ব্যবহার করতে পারি অথবা List.of(), Set.of(), Map.of() এর মতো Immutable collection factory মেথড ব্যবহার করতে পারি (যথাযথভাবে Java 9 বা তার পরবর্তী সংস্করণে)।

1.1. Collections.unmodifiable()

Collections.unmodifiableList(), Collections.unmodifiableSet(), এবং Collections.unmodifiableMap() মেথডগুলো দিয়ে আপনি একটি অপরিবর্তনীয় (immutable) কন্টেইনার তৈরি করতে পারেন।

Example: Immutable List using Collections.unmodifiableList()

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ImmutableListExample {
    public static void main(String[] args) {
        // Creating a modifiable list
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // Creating an immutable list
        List<String> immutableList = Collections.unmodifiableList(list);

        System.out.println("Immutable List: " + immutableList);

        // Trying to modify the immutable list will throw an exception
        try {
            immutableList.add("Mango"); // This will throw UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("Error: Cannot modify an immutable list");
        }
    }
}

Output:

Immutable List: [Apple, Banana, Orange]
Error: Cannot modify an immutable list

ব্যাখ্যা:

  • Collections.unmodifiableList(list) একটি অপরিবর্তনীয় List তৈরি করেছে। যখন আপনি এই immutable list এর সাথে কোনো পরিবর্তন করার চেষ্টা করেন, এটি UnsupportedOperationException ছুড়ে দেয়।

1.2. Immutable Set and Map using Factory Methods (Java 9 and later)

Java 9 থেকে Set.of(), List.of(), এবং Map.of() মেথডগুলো সরাসরি Immutable Set, List, এবং Map তৈরি করতে ব্যবহৃত হতে পারে।

import java.util.Set;

public class ImmutableSetExample {
    public static void main(String[] args) {
        Set<String> fruits = Set.of("Apple", "Banana", "Orange");

        System.out.println("Immutable Set: " + fruits);

        // Trying to modify the immutable set will throw an exception
        try {
            fruits.add("Mango");  // This will throw UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("Error: Cannot modify an immutable set");
        }
    }
}

Output:

Immutable Set: [Apple, Banana, Orange]
Error: Cannot modify an immutable set

ব্যাখ্যা:

  • Set.of() একটি Immutable Set তৈরি করেছে। কোনো নতুন উপাদান যোগ করতে পারবে না।

2. Synchronized Collections

Synchronized Collections এমন Collection যা একাধিক থ্রেড থেকে নিরাপদে অ্যাক্সেস করা যায়। সাধারণত, Java Collections থ্রেড-সেফ নয়, কিন্তু আপনি synchronized প্যাকেজের মাধ্যমে থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন, যেখানে একাধিক থ্রেড একই ডেটা স্ট্রাকচার অ্যাক্সেস করতে পারে।

Collections.synchronizedList(), Collections.synchronizedSet(), এবং Collections.synchronizedMap() মেথডগুলো দিয়ে আপনি থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন।

Example: Synchronized List

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SynchronizedListExample {
    public static void main(String[] args) {
        // Creating a modifiable list
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // Making the list synchronized
        List<String> synchronizedList = Collections.synchronizedList(list);

        // Displaying synchronized list
        System.out.println("Synchronized List: " + synchronizedList);
        
        // Synchronizing manually when iterating
        synchronized (synchronizedList) {
            for (String fruit : synchronizedList) {
                System.out.println(fruit);
            }
        }
    }
}

Output:

Synchronized List: [Apple, Banana, Orange]
Apple
Banana
Orange

ব্যাখ্যা:

  • Collections.synchronizedList(list) এর মাধ্যমে একটি থ্রেড-সেফ List তৈরি করা হয়েছে। যখন আপনি iterator ব্যবহার করে এটি পুনঃপ্রবাহিত করবেন, তখন আপনাকে ম্যানুয়ালি এটি সিঙ্ক্রোনাইজ করতে হবে, যেহেতু Iterator এর জন্য synchronized কোড ব্লক প্রয়োজন।

Example: Synchronized Set

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class SynchronizedSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");

        // Making the set synchronized
        Set<String> synchronizedSet = Collections.synchronizedSet(set);

        // Displaying synchronized set
        System.out.println("Synchronized Set: " + synchronizedSet);

        // Synchronizing manually when iterating
        synchronized (synchronizedSet) {
            for (String fruit : synchronizedSet) {
                System.out.println(fruit);
            }
        }
    }
}

Output:

Synchronized Set: [Apple, Banana, Orange]
Apple
Banana
Orange

3. Differences Between Immutable and Synchronized Collections

FeatureImmutable CollectionSynchronized Collection
MutabilityElements cannot be modified (add, remove, or update).Elements can be modified, but thread-safety is ensured.
Thread SafetyNot inherently thread-safe.Thread-safe; synchronized access to the collection.
PerformanceSlightly more efficient for read-only operations.May have performance overhead due to synchronization.
UsageUsed when you need constant data, no changes allowed.Used when you need to ensure safe access in multi-threaded environments.

  • Immutable Collections তৈরি করার জন্য আপনি Collections.unmodifiable*() মেথড ব্যবহার করতে পারেন অথবা Java 9 থেকে List.of(), Set.of(), Map.of() ব্যবহার করে।
  • Synchronized Collections তৈরি করার জন্য আপনি Collections.synchronized*() মেথড ব্যবহার করতে পারেন, যা থ্রেড-সেফ অপারেশন নিশ্চিত করে।
  • Immutable Collections সাধারণত যখন ডেটা পরিবর্তন সম্ভব নয়, তখন ব্যবহার করা হয়, আর Synchronized Collections থ্রেড-সেফ ডেটা স্ট্রাকচার ব্যবহারের জন্য উপযোগী।

এই দুটি ধরনের কন্টেইনারই আপনাকে বিশেষ পরিস্থিতিতে সাহায্য করে, যেমন যখন আপনি নিশ্চিত করতে চান যে ডেটার কোনো পরিবর্তন না হয় বা আপনি একাধিক থ্রেডের মধ্যে নিরাপদে ডেটা অ্যাক্সেস করতে চান।

Content added By
Promotion

Are you sure to start over?

Loading...